home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
xlib
/
xlib06
/
xbmtools.asm
< prev
next >
Wrap
Assembly Source File
|
1993-09-12
|
6KB
|
196 lines
;-----------------------------------------------------------------------
; MODULE XBMTOOLS
;
; Bitmap conversion / manipulation tools
;
; Compile with Tasm.
; C callable.
;
;
; ****** XLIB - Mode X graphics library ****************
; ****** ****************
; ****** Written By Themie Gouthas ****************
;
; egg@dstos3.dsto.gov.au
; teg@bart.dsto.gov.au
;-----------------------------------------------------------------------
COMMENT $
This module implements a set of functions to manipulate both planar
bitmaps and linear bitmaps (as used by x_compile_bitmap):
PLANAR BITMAPS
Planar bitmaps as used by these functions have the following structure:
BYTE 0 The bitmap width in bytes (4 pixel groups) range 1..255
BYTE 1 The bitmap height in rows range 1..255
BYTE 2..n1 The plane 0 pixels width*height bytes
BYTE n1..n2 The plane 1 pixels width*height bytes
BYTE n2..n3 The plane 2 pixels width*height bytes
BYTE n3..n4 The plane 3 pixels width*height bytes
LINEAR BITMAPS
Linear bitmaps have the following structure:
BYTE 0 The bitmap width in pixels range 1..255
BYTE 1 The bitmap height in rows range 1..255
BYTE 2..n The width*height bytes of the bitmap
$
LOCALS
.286
include model.inc
include xbmtools.inc
.code
;-----------------------------------------------------------------------
; x_pbm_to_bm
;
; This function converts a bitmap in the planar format to the linear format
; as used by x_compile_bitmap.
;
; WARNING: the source and destination bitmaps must be pre - allocated
;
; NOTE: This function can only convert planar bitmaps that are suitable.
; If the source planar bitmap's width (per plane) is >= 256/4
; it cannot be converted. In this situation an error code
; BM_WIDTH_ERROR. On successful conversion 0 is returned.
;
; C callable as:
; int x_pbm_to_bm(char far * source_pbm, char far * dest_bm);
;
; Written By Themie Gouthas
proc _x_pbm_to_bm
ARG src_pbm:dword,dest_bm:dword
push bp ; Preserve caller's stack frame
mov bp,sp
push ds
push di
push si
les di,[dest_bm] ; es:di -> destination bitmap
lds si,[src_pbm] ; ds:si -> source planar bitmap
lodsb ; load AL with source pbm pixel width per plane
mov bl,al ; save in CL
xor ah,ah ; convert to word
shl ax,2 ; mult by 4 giving source image width
cmp ax,255 ; if the result > 255 then we have exceeded
ja @@WidthError ; the max width of linear bm.
stosb ; write do dest_bm
lodsb ; tranfer source pbm height in pixels to
stosb ; dest_bm
xor ah,ah ; convert to word
mul bl ; AX = AX * BL ie. total no. pixels per plane
mov dx,di ; save DI, the pointer to the destination bm
mov bl,3 ; set plane loop counter (BL)
@@PlaneLoop:
mov cx,ax ; set CX to total number of pixels per plane
@@PixelLoop:
movsb ; transfer pixel
add di,3 ; increment destination to compensate for plane
loop @@PixelLoop
inc dx ; increment original di for next pixel plane
mov di,dx ; and restore di from incremented original
dec bl ; decrement plane counter
jns @@PlaneLoop ; loop if more planes left
xor ax,ax
jmp short @@Done
@@WidthError:
mov ax,1
@@Done:
pop si
pop di
pop ds
pop bp ;restore caller's stack frame
ret
_x_pbm_to_bm endp
;-----------------------------------------------------------------------
; x_bm_to_pbm
;
; This function converts a bitmap in the linear format as used by
; x_compile_bitmap to the planar formap.
;
; WARNING: the source and destination bitmaps must be pre - allocated
;
; NOTE: This function can only convert linear bitmaps that are suitable.
; If the source linear bitmap's width is not a multiple of 4
; it cannot be converted. In this situation an error code
; BM_WIDTH_ERROR. On successful conversion 0 is returned.
;
;
; C callable as:
; int x_bm_to_pbm(char far * source_pbm, char far * dest_bm);
;
; Written By Themie Gouthas
proc _x_bm_to_pbm
ARG src_bm:dword,dest_pbm:dword
push bp ; Preserve caller's stack frame
mov bp,sp
push ds
push di
push si
les di,[dest_pbm] ; es:di -> destination planar bitmap
lds si,[src_bm] ; ds:si -> source bitmap
lodsb ; load AX with source bitmap width
test al,03h ; Check that width is a multiple of 4
jnz @@WidthIncompatible
shr al,2 ; divide by 4 giving width of plane
stosb ; store destination planar bitmap width
mov bl,al ; and copy to bl
lodsb
stosb ; Transfer source bitmap height to dest pbm
xor ah,ah ; Conver height to word
mul bl ; calculate the total no. of pixels / plane
mov dx,si ; save source offset
mov bl,3
@@PlaneLoop:
mov cx,ax ; set CX to total number of pixels per plane
@@PixelLoop:
movsb ; transfer pixel
add si,3 ; increment src offset to compensate for plane
loop @@PixelLoop
inc dx ; increment original si for next pixel plane
mov si,dx ; and restore si from incremented original
dec bl ; decrement plane counter
jns @@PlaneLoop ; loop if more planes left
xor ax,ax
jmp short @@Done
@@WidthIncompatible:
mov ax,1
@@Done:
pop si
pop di
pop ds
pop bp ;restore caller's stack frame
ret
_x_bm_to_pbm endp
end